ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãäžå¿ã«ã¡ã¢ãªç®¡çã®äžçãæ¢ããŸããæ¬ã¬ã€ãã¯æ§ã ãªGCæŠç¥ããã®é·æã»çæããããŠäžçäžã®éçºè ã«ãšã£ãŠã®å®è·µçãªæå³åãã解説ããŸãã
ã¡ã¢ãªç®¡çïŒã¬ããŒãžã³ã¬ã¯ã·ã§ã³æŠç¥ã®åŸ¹åºè§£èª¬
ã¡ã¢ãªç®¡çã¯ãœãããŠã§ã¢éçºã«ãããŠæ¥µããŠéèŠãªåŽé¢ã§ãããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãå®å®æ§ãã¹ã±ãŒã©ããªãã£ã«çŽæ¥åœ±é¿ããŸããå¹ççãªã¡ã¢ãªç®¡çã¯ãã¢ããªã±ãŒã·ã§ã³ããªãœãŒã¹ã广çã«äœ¿çšããããšãä¿èšŒããã¡ã¢ãªãªãŒã¯ãã¯ã©ãã·ã¥ãé²ããŸããæåã§ã®ã¡ã¢ãªç®¡çïŒäŸïŒCãC++ïŒã¯ãã现ããªå¶åŸ¡ãæäŸããŸãããé倧ãªåé¡ã«ã€ãªããå¯èœæ§ã®ãããšã©ãŒãèµ·ãããããã§ããèªåã¡ã¢ãªç®¡çãç¹ã«ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒGCïŒã«ãã管çã¯ãããå®å šã§äŸ¿å©ãªä»£æ¿ææ®µãæäŸããŸãããã®èšäºã§ã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®äžçãæ·±ãæãäžããæ§ã ãªæŠç¥ãšãããäžçäžã®éçºè ã«äžãã圱é¿ã«ã€ããŠæ¢ããŸãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãšã¯äœãïŒ
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯èªåã¡ã¢ãªç®¡çã®äžåœ¢æ ã§ãããã¬ããŒãžã³ã¬ã¯ã¿ãããã°ã©ã ã«ãã£ãŠäœ¿çšãããªããªã£ããªããžã§ã¯ããå æããã¡ã¢ãªãååããããšããŸãããã¬ããŒãžããšããçšèªã¯ãããã°ã©ã ããã¯ãå°éãŸãã¯åç §ã§ããªããªã£ããªããžã§ã¯ããæããŸããGCã®äž»ãªç®æšã¯ãåå©çšã®ããã«ã¡ã¢ãªãè§£æŸããã¡ã¢ãªãªãŒã¯ãé²ããéçºè ã®ã¡ã¢ãªç®¡çã¿ã¹ã¯ãç°¡çŽ åããããšã§ãããã®æœè±¡åã«ãããéçºè ã¯æç€ºçã«ã¡ã¢ãªãå²ãåœãŠããè§£æŸãããããå¿ èŠããªããªãããšã©ãŒã®ãªã¹ã¯ãæžãããéçºã®çç£æ§ãåäžãããŸããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯ãJavaãC#ãPythonãJavaScriptãGoãªã©ãå€ãã®çŸä»£çãªããã°ã©ãã³ã°èšèªã«ãããŠäžå¯æ¬ ãªã³ã³ããŒãã³ãã§ãã
ãªãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯éèŠãªã®ãïŒ
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯ããœãããŠã§ã¢éçºã«ãããããã€ãã®éèŠãªæžå¿µäºé ã«å¯ŸåŠããŸãïŒ
- ã¡ã¢ãªãªãŒã¯ã®é²æ¢ïŒ ã¡ã¢ãªãªãŒã¯ã¯ãããã°ã©ã ãã¡ã¢ãªãå²ãåœãŠãåŸãäžèŠã«ãªã£ãŠãè§£æŸããªãã£ãå Žåã«çºçããŸããæéãšãšãã«ããããã®ãªãŒã¯ã¯å©çšå¯èœãªãã¹ãŠã®ã¡ã¢ãªãæ¶è²»ããã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ãã·ã¹ãã ã®äžå®å®åã«ã€ãªããå¯èœæ§ããããŸããGCã¯æªäœ¿çšã®ã¡ã¢ãªãèªåçã«ååããã¡ã¢ãªãªãŒã¯ã®ãªã¹ã¯ã軜æžããŸãã
- éçºã®ç°¡çŽ åïŒ æåã§ã®ã¡ã¢ãªç®¡çã§ã¯ãéçºè ã¯ã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã现å¿ã®æ³šæãæã£ãŠè¿œè·¡ããå¿ èŠããããŸãããã®ããã»ã¹ã¯ãšã©ãŒãçºçãããããæéããããå¯èœæ§ããããŸããGCã¯ãã®ããã»ã¹ãèªååããéçºè ãã¡ã¢ãªç®¡çã®è©³çްã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ã«éäžã§ããããã«ããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§åäžïŒ æªäœ¿çšã®ã¡ã¢ãªãèªåçã«ååããããšã§ãGCã¯ãã³ã°ãªã³ã°ãã€ã³ã¿ãäºéè§£æŸãšã©ãŒãšãã£ãã¡ã¢ãªé¢é£ã®ãšã©ãŒãé²ãã®ã«åœ¹ç«ã¡ãŸãããããã¯äºæž¬äžèœãªã¢ããªã±ãŒã·ã§ã³ã®æåãã¯ã©ãã·ã¥ãåŒãèµ·ããå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒ GCã«ã¯å€å°ã®ãªãŒããŒãããã䌎ããŸãããå²ãåœãŠã«ååãªã¡ã¢ãªãå©çšå¯èœã§ããããšãä¿èšŒããã¡ã¢ãªã®æçåã®å¯èœæ§ãæžããããšã§ãã¢ããªã±ãŒã·ã§ã³å šäœã®ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
äžè¬çãªã¬ããŒãžã³ã¬ã¯ã·ã§ã³æŠç¥
ããã€ãã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³æŠç¥ãååšããããããã«é·æãšçæããããŸããæŠç¥ã®éžæã¯ãããã°ã©ãã³ã°èšèªãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªäœ¿çšãã¿ãŒã³ãããã©ãŒãã³ã¹èŠä»¶ãªã©ã®èŠå ã«äŸåããŸãã以äžã«æãäžè¬çãªGCæŠç¥ãããã€ã玹ä»ããŸãïŒ
1. åç §ã«ãŠã³ã
ä»çµã¿ïŒ åç §ã«ãŠã³ãã¯ãåãªããžã§ã¯ããèªèº«ãæãåç §ã®æ°ãä¿æããåçŽãªGCæŠç¥ã§ãããªããžã§ã¯ããäœæããããšããã®åç §ã«ãŠã³ãã¯1ã«åæåãããŸãããªããžã§ã¯ããžã®æ°ããåç §ãäœæããããšãã«ãŠã³ãã¯ã€ã³ã¯ãªã¡ã³ããããŸããåç §ãåé€ããããšãã«ãŠã³ãã¯ãã¯ãªã¡ã³ããããŸããåç §ã«ãŠã³ãããŒãã«ãªããšãããã°ã©ã å ã®ä»ã®ãªããžã§ã¯ãããã®ãªããžã§ã¯ããåç §ããŠããªãããšãæå³ãããã®ã¡ã¢ãªã¯å®å šã«ååã§ããŸãã
é·æïŒ
- å®è£ ãã·ã³ãã«ïŒ åç §ã«ãŠã³ãã¯ä»ã®GCã¢ã«ãŽãªãºã ãšæ¯èŒããŠå®è£ ãæ¯èŒçç°¡åã§ãã
- 峿ååïŒ ãªããžã§ã¯ãã®åç §ã«ãŠã³ãããŒãã«ãªããšããã«ã¡ã¢ãªãååãããããããªãœãŒã¹ã®è§£æŸãè¿ éã«è¡ãããŸãã
- 決å®è«çãªåäœïŒ ã¡ã¢ãªååã®ã¿ã€ãã³ã°ãäºæž¬å¯èœã§ããããããªã¢ã«ã¿ã€ã ã·ã¹ãã ã§æçãªå ŽåããããŸãã
çæïŒ
- 埪ç°åç §ãåŠçã§ããªãïŒ 2ã€ä»¥äžã®ãªããžã§ã¯ããäºãã«åç §ãåãããµã€ã¯ã«ã圢æããå Žåãããã°ã©ã ã®ã«ãŒãããå°éäžå¯èœã§ãã£ãŠãããããã®åç §ã«ãŠã³ãã¯æ±ºããŠãŒãã«ãªããŸãããããã¯ã¡ã¢ãªãªãŒã¯ã«ã€ãªããå¯èœæ§ããããŸãã
- åç §ã«ãŠã³ãç¶æã®ãªãŒããŒãããïŒ åç §ã«ãŠã³ãã®ã€ã³ã¯ãªã¡ã³ããšãã¯ãªã¡ã³ãã¯ããã¹ãŠã®ä»£å ¥æäœã«ãªãŒããŒãããã远å ããŸãã
- ã¹ã¬ããã»ãŒããã£ã®æžå¿µïŒ ãã«ãã¹ã¬ããç°å¢ã§åç §ã«ãŠã³ããç¶æããã«ã¯åæã¡ã«ããºã ãå¿ èŠã§ãããããã«ããããã«ãªãŒããŒããããå¢å ããå¯èœæ§ããããŸãã
äŸïŒ Pythonã¯é·å¹Žãäž»èŠãªGCã¡ã«ããºã ãšããŠåç §ã«ãŠã³ãã䜿çšããŠããŸããããããã埪ç°åç §ã®åé¡ã«å¯ŸåŠããããã«ãå¥ã®ãµã€ã¯ã«æ€åºåšãåããŠããŸãã
2. ããŒã¯ïŒã¹ã€ãŒã
ä»çµã¿ïŒ ããŒã¯ïŒã¹ã€ãŒãã¯ã2ã€ã®ãã§ãŒãºãããªããããæŽç·ŽãããGCæŠç¥ã§ãïŒ
- ããŒã¯ãã§ãŒãºïŒ ã¬ããŒãžã³ã¬ã¯ã¿ã¯ãã«ãŒããªããžã§ã¯ãïŒäŸïŒã°ããŒãã«å€æ°ãã¹ã¿ãã¯äžã®ããŒã«ã«å€æ°ïŒã®ã»ããããéå§ããŠãªããžã§ã¯ãã°ã©ããèµ°æ»ããŸããå°éå¯èœãªåãªããžã§ã¯ãããçåããŠããããšããŒã¯ããŸãã
- ã¹ã€ãŒããã§ãŒãºïŒ ã¬ããŒãžã³ã¬ã¯ã¿ã¯ããŒãå šäœãã¹ãã£ã³ãããçåããŠããããšããŒã¯ãããŠããªããªããžã§ã¯ããç¹å®ããŸãããããã®ãªããžã§ã¯ãã¯ã¬ããŒãžãšèŠãªããããã®ã¡ã¢ãªã¯ååãããŸãã
é·æïŒ
- 埪ç°åç §ãåŠçã§ããïŒ ããŒã¯ïŒã¹ã€ãŒãã¯ã埪ç°åç §ã«é¢äžãããªããžã§ã¯ããæ£ããèå¥ããååã§ããŸãã
- ä»£å ¥æã®ãªãŒããŒãããããªãïŒ åç §ã«ãŠã³ããšã¯ç°ãªããããŒã¯ïŒã¹ã€ãŒãã¯ä»£å ¥æäœã«ãªãŒããŒããããå¿ èŠãšããŸããã
çæïŒ
- ãStop-the-Worldãã«ããäžæåæ¢ïŒ ããŒã¯ïŒã¹ã€ãŒãã¢ã«ãŽãªãºã ã¯éåžžãã¬ããŒãžã³ã¬ã¯ã¿ã®å®è¡äžã«ã¢ããªã±ãŒã·ã§ã³ãäžæåæ¢ããå¿ èŠããããŸãããããã®åæ¢ã¯ãç¹ã«ã€ã³ã¿ã©ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³ã§ã¯é¡èã§ãäžæãæãå¯èœæ§ããããŸãã
- ã¡ã¢ãªã®æçåïŒ ç¹°ãè¿ãããå²ãåœãŠãšè§£æŸã«ãããæéã®çµéãšãšãã«ã¡ã¢ãªã®æçåãçºçããå¯èœæ§ããããŸããããã¯ã空ãã¡ã¢ãªãå°ãããé£ç¶ããŠããªããããã¯ã«æ£åšããç¶æ ã§ããããã«ããã倧ããªãªããžã§ã¯ãã®å²ãåœãŠãå°é£ã«ãªãããšããããŸãã
- æéããããå¯èœæ§ãããïŒ ããŒãå šäœãã¹ãã£ã³ããã®ã¯ãç¹ã«å€§ããªããŒãã®å Žåãæéããããå¯èœæ§ããããŸãã
äŸïŒ JavaïŒäžéšã®å®è£ ïŒãJavaScriptãRubyãªã©å€ãã®èšèªããGCå®è£ ã®äžéšãšããŠããŒã¯ïŒã¹ã€ãŒãã䜿çšããŠããŸãã
3. äžä»£å¥ã¬ããŒãžã³ã¬ã¯ã·ã§ã³
ä»çµã¿ïŒ äžä»£å¥ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯ãã»ãšãã©ã®ãªããžã§ã¯ãã¯å¯¿åœãçããšãã芳å¯ã«åºã¥ããŠããŸãããã®æŠç¥ã§ã¯ãããŒããè€æ°ã®äžä»£ãéåžžã¯2ã€ãŸãã¯3ã€ã«åå²ããŸãïŒ
- è¥ãäžä»£ïŒYoung GenerationïŒïŒ æ°ããäœæããããªããžã§ã¯ããå«ãŸããŸãããã®äžä»£ã¯é »ç¹ã«ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããŸãã
- å€ãäžä»£ïŒOld GenerationïŒïŒ è¥ãäžä»£ã§ã®è€æ°åã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãµã€ã¯ã«ãçãå»¶ã³ããªããžã§ã¯ããå«ãŸããŸãããã®äžä»£ã¯ããŸãé »ç¹ã«ã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãããŸããã
- æ°žç¶äžä»£ïŒPermanent GenerationïŒãŸãã¯ã¡ã¿ã¹ããŒã¹ïŒMetaspaceïŒïŒ ïŒäžéšã®JVMå®è£ ã«ãããŠïŒã¯ã©ã¹ãã¡ãœããã«é¢ããã¡ã¿ããŒã¿ãå«ãŸããŸãã
è¥ãäžä»£ããã£ã±ãã«ãªããšããã€ããŒã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå®è¡ãããæ»ãã ãªããžã§ã¯ããå ããã¡ã¢ãªãååãããŸãããã€ããŒã³ã¬ã¯ã·ã§ã³ãçãå»¶ã³ããªããžã§ã¯ãã¯ãå€ãäžä»£ã«ææ ŒããŸããå€ãäžä»£ãåéããã¡ãžã£ãŒã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯ãããŸãé »ç¹ã«ã¯å®è¡ããããéåžžã¯ããæéãããããŸãã
é·æïŒ
- äžæåæ¢æéãççž®ïŒ ã»ãšãã©ã®ã¬ããŒãžãå«ãŸããè¥ãäžä»£ã®åéã«éäžããããšã§ãäžä»£å¥GCã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®äžæåæ¢æéãççž®ããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒ è¥ãäžä»£ãããé »ç¹ã«åéããããšã§ãäžä»£å¥GCã¯ã¢ããªã±ãŒã·ã§ã³å šäœã®ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
çæïŒ
- è€éãïŒ äžä»£å¥GCã¯ãåç §ã«ãŠã³ããããŒã¯ïŒã¹ã€ãŒãã®ãããªåçŽãªæŠç¥ãããå®è£ ãè€éã§ãã
- ãã¥ãŒãã³ã°ãå¿ èŠïŒ ããã©ãŒãã³ã¹ãæé©åããããã«ã¯ãäžä»£ã®ãµã€ãºãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®é »åºŠãæ éã«ãã¥ãŒãã³ã°ããå¿ èŠããããŸãã
äŸïŒ Javaã®HotSpot JVMã¯äžä»£å¥ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãåºç¯ã«äœ¿çšããŠãããG1ïŒGarbage FirstïŒãCMSïŒConcurrent Mark SweepïŒãªã©ã®æ§ã ãªã¬ããŒãžã³ã¬ã¯ã¿ãç°ãªãäžä»£å¥æŠç¥ãå®è£ ããŠããŸãã
4. ã³ããŒGC
ä»çµã¿ïŒ ã³ããŒGCã¯ãããŒããåããµã€ãºã®2ã€ã®é åãFrom空éãšTo空éã«åå²ããŸãããªããžã§ã¯ãã¯æåã«From空éã«å²ãåœãŠãããŸããFrom空éããã£ã±ãã«ãªããšãã¬ããŒãžã³ã¬ã¯ã¿ã¯ãã¹ãŠã®çåãªããžã§ã¯ããFrom空éããTo空éã«ã³ããŒããŸããã³ããŒåŸãFrom空éã¯æ°ããTo空éã«ãªããTo空éã¯æ°ããFrom空éã«ãªããŸããå€ãFrom空éã¯ç©ºã«ãªããæ°ããå²ãåœãŠã®æºåãã§ããŸãã
é·æïŒ
- æçåãè§£æ¶ïŒ ã³ããŒGCã¯çåãªããžã§ã¯ããé£ç¶ããã¡ã¢ãªãããã¯ã«å§çž®ãããããã¡ã¢ãªã®æçåãè§£æ¶ããŸãã
- å®è£ ãã·ã³ãã«ïŒ åºæ¬çãªã³ããŒGCã¢ã«ãŽãªãºã ã¯æ¯èŒçç°¡åã«å®è£ ã§ããŸãã
çæïŒ
- å©çšå¯èœãªã¡ã¢ãªãååã«ãªãïŒ ã³ããŒGCã¯ãããŒãã®ååãåžžã«æªäœ¿çšã§ããããããªããžã§ã¯ããæ ŒçŽããããã«å®éã«å¿ èŠãªã¡ã¢ãªã®2åã®éãå¿ èŠãšããŸãã
- ãStop-the-Worldãã«ããäžæåæ¢ïŒ ã³ããŒããã»ã¹ã¯ã¢ããªã±ãŒã·ã§ã³ãäžæåæ¢ããå¿ èŠããããé¡èãªåæ¢ã«ã€ãªããå¯èœæ§ããããŸãã
äŸïŒ ã³ããŒGCã¯ãä»ã®GCæŠç¥ãç¹ã«äžä»£å¥ã¬ããŒãžã³ã¬ã¯ã¿ã®è¥ãäžä»£ã§ãã°ãã°äœµçšãããŸãã
5. ã³ã³ã«ã¬ã³ãGCãšãã©ã¬ã«GC
ä»çµã¿ïŒ ãããã®æŠç¥ã¯ãã¢ããªã±ãŒã·ã§ã³ã®å®è¡ãšåæã«GCãå®è¡ããïŒã³ã³ã«ã¬ã³ãGCïŒããè€æ°ã®ã¹ã¬ããã䜿çšããŠäžŠåã«GCãå®è¡ããïŒãã©ã¬ã«GCïŒããšã§ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®äžæåæ¢ã®åœ±é¿ã軜æžããããšãç®æããŸãã
- ã³ã³ã«ã¬ã³ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒ ã¬ããŒãžã³ã¬ã¯ã¿ã¯ã¢ããªã±ãŒã·ã§ã³ãšåæã«å®è¡ãããäžæåæ¢ã®æéãæå°éã«æããŸããããã«ã¯éåžžãã€ã³ã¯ãªã¡ã³ã¿ã«ããŒãã³ã°ãæžã蟌ã¿ããªã¢ãªã©ã®æè¡ã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³å®è¡äžã®ãªããžã§ã¯ãã°ã©ããžã®å€æŽã远跡ããŸãã
- ãã©ã¬ã«ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒ ã¬ããŒãžã³ã¬ã¯ã¿ã¯è€æ°ã®ã¹ã¬ããã䜿çšããŠããŒã¯ãã§ãŒãºãšã¹ã€ãŒããã§ãŒãºã䞊åã«å®è¡ããGCå šäœã®æéãççž®ããŸãã
é·æïŒ
- äžæåæ¢æéã®ççž®ïŒ ã³ã³ã«ã¬ã³ãGCãšãã©ã¬ã«GCã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®äžæåæ¢æéãå€§å¹ ã«ççž®ããã€ã³ã¿ã©ã¯ãã£ããªã¢ããªã±ãŒã·ã§ã³ã®å¿çæ§ãåäžãããããšãã§ããŸãã
- ã¹ã«ãŒãããã®åäžïŒ ãã©ã¬ã«GCã¯ãè€æ°ã®CPUã³ã¢ãå©çšããŠã¬ããŒãžã³ã¬ã¯ã¿å šäœã®ã¹ã«ãŒããããåäžãããããšãã§ããŸãã
çæïŒ
- è€éæ§ã®å¢å ïŒ ã³ã³ã«ã¬ã³ãGCããã³ãã©ã¬ã«GCã¢ã«ãŽãªãºã ã¯ãããåçŽãªæŠç¥ãããå®è£ ãè€éã§ãã
- ãªãŒããŒãããïŒ ãããã®æŠç¥ã¯ãåæãæžã蟌ã¿ããªã¢æäœã«ãããªãŒããŒããããå°å ¥ããŸãã
äŸïŒ Javaã®CMSïŒConcurrent Mark SweepïŒããã³G1ïŒGarbage FirstïŒã³ã¬ã¯ã¿ã¯ãã³ã³ã«ã¬ã³ãããã³ãã©ã¬ã«ã¬ããŒãžã³ã¬ã¯ã¿ã®äŸã§ãã
é©åãªã¬ããŒãžã³ã¬ã¯ã·ã§ã³æŠç¥ã®éžæ
é©åãªã¬ããŒãžã³ã¬ã¯ã·ã§ã³æŠç¥ã®éžæã¯ã以äžãå«ãæ§ã ãªèŠå ã«äŸåããŸãïŒ
- ããã°ã©ãã³ã°èšèªïŒ ããã°ã©ãã³ã°èšèªãå©çšå¯èœãªGCæŠç¥ã決å®ããããšããããããŸããäŸãã°ãJavaã¯ããã€ãã®ç°ãªãã¬ããŒãžã³ã¬ã¯ã¿ã®éžæè¢ãæäŸããŸãããä»ã®èšèªã«ã¯åäžã®çµã¿èŸŒã¿GCå®è£ ãããªãå ŽåããããŸãã
- ã¢ããªã±ãŒã·ã§ã³èŠä»¶ïŒ ã¬ã€ãã³ã·ã®æåºŠãã¹ã«ãŒãããèŠä»¶ãªã©ãã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ãGCæŠç¥ã®éžæã«åœ±é¿ãäžããå¯èœæ§ããããŸããäŸãã°ãäœã¬ã€ãã³ã·ãå¿ èŠãšããã¢ããªã±ãŒã·ã§ã³ã¯ã³ã³ã«ã¬ã³ãGCã®æ©æµãåããå¯èœæ§ããããã¹ã«ãŒããããåªå ããã¢ããªã±ãŒã·ã§ã³ã¯ãã©ã¬ã«GCã®æ©æµãåããå¯èœæ§ããããŸãã
- ããŒããµã€ãºïŒ ããŒãã®ãµã€ãºããç°ãªãGCæŠç¥ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸããäŸãã°ãããŒã¯ïŒã¹ã€ãŒãã¯éåžžã«å€§ããªããŒãã§ã¯å¹çãäœäžããå¯èœæ§ããããŸãã
- ããŒããŠã§ã¢ïŒ CPUã³ã¢ã®æ°ãšå©çšå¯èœãªã¡ã¢ãªã®éã¯ããã©ã¬ã«GCã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
- ã¯ãŒã¯ããŒãïŒ ã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªå²ãåœãŠãšè§£æŸã®ãã¿ãŒã³ããGCæŠç¥ã®éžæã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
以äžã®ã·ããªãªãèããŠã¿ãŸãããïŒ
- ãªã¢ã«ã¿ã€ã ã¢ããªã±ãŒã·ã§ã³ïŒ çµèŸŒã¿ã·ã¹ãã ãå¶åŸ¡ã·ã¹ãã ãªã©ã峿 Œãªãªã¢ã«ã¿ã€ã æ§èœãå¿ èŠãšããã¢ããªã±ãŒã·ã§ã³ã¯ãåç §ã«ãŠã³ããã€ã³ã¯ãªã¡ã³ã¿ã«GCã®ãããªãäžæåæ¢æéãæå°éã«æããæ±ºå®è«çãªGCæŠç¥ã®æ©æµãåããå¯èœæ§ããããŸãã
- ã€ã³ã¿ã©ã¯ãã£ãã¢ããªã±ãŒã·ã§ã³ïŒ Webã¢ããªã±ãŒã·ã§ã³ããã¹ã¯ãããã¢ããªã±ãŒã·ã§ã³ãªã©ãäœã¬ã€ãã³ã·ãå¿ èŠãšããã¢ããªã±ãŒã·ã§ã³ã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãã¢ããªã±ãŒã·ã§ã³ãšåæã«å®è¡ãããã³ã³ã«ã¬ã³ãGCã®æ©æµãåããå¯èœæ§ãããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãžã®åœ±é¿ãæå°éã«æããŸãã
- é«ã¹ã«ãŒãããã¢ããªã±ãŒã·ã§ã³ïŒ ãããåŠçã·ã¹ãã ãããŒã¿åæã¢ããªã±ãŒã·ã§ã³ãªã©ãã¹ã«ãŒããããåªå ããã¢ããªã±ãŒã·ã§ã³ã¯ãè€æ°ã®CPUã³ã¢ãå©çšããŠã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããã»ã¹ãé«éåãããã©ã¬ã«GCã®æ©æµãåããå¯èœæ§ããããŸãã
- ã¡ã¢ãªå¶çŽã®ããç°å¢ïŒ ã¢ãã€ã«ããã€ã¹ãçµèŸŒã¿ã·ã¹ãã ãªã©ãã¡ã¢ãªãéãããŠããç°å¢ã§ã¯ãã¡ã¢ãªã®ãªãŒããŒããããæå°éã«æããããšãéèŠã§ããã¡ã¢ãªã2åå¿ èŠãšããã³ããŒGCããããããŒã¯ïŒã¹ã€ãŒãã®ãããªæŠç¥ã奜ãŸããå ŽåããããŸãã
éçºè ã®ããã®å®è·µçãªèæ ®äºé
èªåã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããã£ãŠããéçºè ã¯å¹ççãªã¡ã¢ãªç®¡çã確ä¿ããäžã§éèŠãªåœ¹å²ãæãããŸãã以äžã«ããã€ãã®å®è·µçãªèæ ®äºé ãæããŸãïŒ
- äžèŠãªãªããžã§ã¯ãã®äœæãé¿ããïŒ å€§éã®ãªããžã§ã¯ããäœæããŠç Žæ£ãããšãã¬ããŒãžã³ã¬ã¯ã¿ã«è² æ ãããããäžæåæ¢æéãå¢å ããå¯èœæ§ããããŸããå¯èœãªéããªããžã§ã¯ããåå©çšããããã«ããŠãã ããã
- ãªããžã§ã¯ãã®å¯¿åœãæå°éã«ããïŒ äžèŠã«ãªã£ããªããžã§ã¯ãã¯ã§ããã ãæ©ãåç §ãè§£é€ããã¬ããŒãžã³ã¬ã¯ã¿ããã®ã¡ã¢ãªãååã§ããããã«ãã¹ãã§ãã
- 埪ç°åç §ã«æ³šæããïŒ ãªããžã§ã¯ãéã«åŸªç°åç §ãäœæããããšã¯é¿ããŠãã ããããããã¯ã¬ããŒãžã³ã¬ã¯ã¿ããã®ã¡ã¢ãªãååããã®ã劚ããå¯èœæ§ããããŸãã
- ããŒã¿æ§é ãå¹ççã«äœ¿çšããïŒ æå ã®ã¿ã¹ã¯ã«é©ããããŒã¿æ§é ãéžæããŠãã ãããäŸãã°ãããå°ããªããŒã¿æ§é ã§ååãªå Žåã«å€§ããªé åã䜿çšãããšãã¡ã¢ãªã浪費ããå¯èœæ§ããããŸãã
- ã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããïŒ ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«é¢é£ããã¡ã¢ãªãªãŒã¯ãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããŸãããããã®ããŒã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãã©ã®ããã«ã¡ã¢ãªã䜿çšããŠãããã«ã€ããŠã®è²ŽéãªæŽå¯ãæäŸããã³ãŒããæé©åããã®ã«åœ¹ç«ã¡ãŸããå€ãã®IDEããããã¡ã€ã©ã«ã¯ãGCç£èŠçšã®ç¹å®ã®ããŒã«ããããŸãã
- 䜿çšèšèªã®GCèšå®ãçè§£ããïŒ GCãæã€ã»ãšãã©ã®èšèªã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãæ§æãããªãã·ã§ã³ãæäŸããŠããŸããã¢ããªã±ãŒã·ã§ã³ã®ããŒãºã«åºã¥ããŠæé©ãªããã©ãŒãã³ã¹ãåŸãããã«ããããã®èšå®ããã¥ãŒãã³ã°ããæ¹æ³ãåŠã³ãŸããããäŸãã°ãJavaã§ã¯ãç°ãªãã¬ããŒãžã³ã¬ã¯ã¿ïŒG1ãCMSãªã©ïŒãéžæããããããŒããµã€ãºã®ãã©ã¡ãŒã¿ã調æŽãããã§ããŸãã
- ãªãããŒãã¡ã¢ãªãæ€èšããïŒ éåžžã«å€§ããªããŒã¿ã»ãããé·å¯¿åœã®ãªããžã§ã¯ãã«ã€ããŠã¯ããªãããŒãã¡ã¢ãªã®äœ¿çšãæ€èšããŠãã ãããããã¯ïŒäŸãã°Javaã§ã¯ïŒJavaããŒãã®å€éšã§ç®¡çãããã¡ã¢ãªã§ããããã«ãããã¬ããŒãžã³ã¬ã¯ã¿ãžã®è² æ ã軜æžããããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
æ§ã ãªããã°ã©ãã³ã°èšèªã«ãããäŸ
ããã€ãã®äººæ°ã®ããããã°ã©ãã³ã°èšèªã§ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãã©ã®ããã«æ±ãããããèŠãŠã¿ãŸãããïŒ
- JavaïŒ Javaã¯ãæ§ã
ãªã³ã¬ã¯ã¿ïŒSerialãParallelãCMSãG1ãZGCïŒãåããæŽç·Žãããäžä»£å¥ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã·ã¹ãã ã䜿çšããŸããéçºè
ã¯å€ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã«æé©ãªã³ã¬ã¯ã¿ãéžæã§ããŸããJavaã§ã¯ãã³ãã³ãã©ã€ã³ãã©ã°ãéããŠããçšåºŠã®GCãã¥ãŒãã³ã°ãå¯èœã§ããäŸïŒ
-XX:+UseG1GC - C#ïŒ C#ã¯äžä»£å¥ã¬ããŒãžã³ã¬ã¯ã¿ã䜿çšããŸãã.NETã©ã³ã¿ã€ã ãèªåçã«ã¡ã¢ãªã管çããŸããC#ã¯ãŸãã
IDisposableã€ã³ã¿ãŒãã§ãŒã¹ãšusingã¹ããŒãã¡ã³ããéããŠãªãœãŒã¹ã®æ±ºå®è«çãªç Žæ£ããµããŒãããŠãããããã«ããç¹å®ã®çš®é¡ã®ãªãœãŒã¹ïŒäŸïŒãã¡ã€ã«ãã³ãã«ãããŒã¿ããŒã¹æ¥ç¶ïŒã«å¯Ÿããã¬ããŒãžã³ã¬ã¯ã¿ã®è² æ ã軜æžã§ããŸãã - PythonïŒ Pythonã¯äž»ãšããŠåç
§ã«ãŠã³ãã䜿çšãã埪ç°åç
§ãåŠçããããã«ãµã€ã¯ã«æ€åºåšã§è£å®ãããŠããŸããPythonã®
gcã¢ãžã¥ãŒã«ã«ãããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãµã€ã¯ã«ã®åŒ·å¶å®è¡ãªã©ãã¬ããŒãžã³ã¬ã¯ã¿ãããçšåºŠå¶åŸ¡ã§ããŸãã - JavaScriptïŒ JavaScriptã¯ããŒã¯ïŒã¹ã€ãŒãã¬ããŒãžã³ã¬ã¯ã¿ã䜿çšããŸããéçºè ã¯GCããã»ã¹ãçŽæ¥å¶åŸ¡ããããšã¯ã§ããŸãããããã®ä»çµã¿ãçè§£ããããšã§ãããå¹ççãªã³ãŒããèšè¿°ããã¡ã¢ãªãªãŒã¯ãåé¿ããã®ã«åœ¹ç«ã¡ãŸããChromeãNode.jsã§äœ¿çšãããŠããJavaScriptãšã³ãžã³ã§ããV8ã¯ãè¿å¹ŽGCã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããŠããŸãã
- GoïŒ Goã¯ã³ã³ã«ã¬ã³ããªããã©ã€ã«ã©ãŒã®ããŒã¯ïŒã¹ã€ãŒãã¬ããŒãžã³ã¬ã¯ã¿ãæã£ãŠããŸããGoã©ã³ã¿ã€ã ãèªåçã«ã¡ã¢ãªã管çããŸãããã®èšèšã¯ãäœã¬ã€ãã³ã·ãšã¢ããªã±ãŒã·ã§ã³ããã©ãŒãã³ã¹ãžã®æå°éã®åœ±é¿ãéèŠããŠããŸãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®æªæ¥
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯é²åãç¶ããåéã§ãããããã©ãŒãã³ã¹ã®åäžãäžæåæ¢æéã®ççž®ãæ°ããããŒããŠã§ã¢ã¢ãŒããã¯ãã£ãããã°ã©ãã³ã°ãã©ãã€ã ãžã®é©å¿ã«çŠç¹ãåœãŠãç ç©¶éçºãé²è¡äžã§ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«ãããæ°ããªãã¬ã³ãã«ã¯ã以äžã®ãããªãã®ããããŸãïŒ
- ãªãŒãžã§ã³ããŒã¹ã®ã¡ã¢ãªç®¡çïŒ ãªãŒãžã§ã³ããŒã¹ã®ã¡ã¢ãªç®¡çã¯ããªããžã§ã¯ããã¡ã¢ãªã®ãªãŒãžã§ã³ã«å²ãåœãŠããããå šäœãšããŠååããããšã§ãåã ã®ãªããžã§ã¯ãååã®ãªãŒããŒããããåæžããŸãã
- ããŒããŠã§ã¢æ¯æŽã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒ ã¡ã¢ãªã¿ã®ã³ã°ãã¢ãã¬ã¹ç©ºéèå¥åïŒASIDïŒãªã©ã®ããŒããŠã§ã¢æ©èœã掻çšããŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ããã©ãŒãã³ã¹ãšå¹çãåäžãããŸãã
- AIãæŽ»çšããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒ æ©æ¢°åŠç¿æè¡ã䜿çšããŠãªããžã§ã¯ãã®å¯¿åœãäºæž¬ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ãã©ã¡ãŒã¿ãåçã«æé©åããŸãã
- ãã³ããããã³ã°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒ ã¢ããªã±ãŒã·ã§ã³ãäžæåæ¢ããããšãªãã¡ã¢ãªãååã§ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¢ã«ãŽãªãºã ãéçºããã¬ã€ãã³ã·ãããã«åæžããŸãã
çµè«
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯ãã¡ã¢ãªç®¡çãç°¡çŽ åãããœãããŠã§ã¢ã¢ããªã±ãŒã·ã§ã³ã®ä¿¡é Œæ§ãåäžãããåºæ¬çãªæè¡ã§ããç°ãªãGCæŠç¥ããã®é·æãšçæãçè§£ããããšã¯ãéçºè ãå¹ççã§ããã©ãŒãã³ã¹ã®é«ãã³ãŒããæžãããã«äžå¯æ¬ ã§ãããã¹ããã©ã¯ãã£ã¹ã«åŸãããããã¡ã€ãªã³ã°ããŒã«ã掻çšããããšã§ãéçºè ã¯ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«å¯Ÿããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®åœ±é¿ãæå°éã«æãããã©ãããã©ãŒã ãããã°ã©ãã³ã°èšèªã«é¢ä¿ãªããã¢ããªã±ãŒã·ã§ã³ãã¹ã ãŒãºãã€å¹ççã«å®è¡ãããããšãä¿èšŒã§ããŸãããã®ç¥èã¯ãã¢ããªã±ãŒã·ã§ã³ã倿§ãªã€ã³ãã©ã¹ãã©ã¯ãã£ããŠãŒã¶ãŒããŒã¹ã§äžè²«ããŠã¹ã±ãŒãªã³ã°ããããã©ãŒãã³ã¹ãçºæ®ããå¿ èŠãããã°ããŒãã«åãããéçºç°å¢ã«ãããŠããŸããŸãéèŠã«ãªã£ãŠããŸãã